#-*- coding: utf8 -*-
from tutor.script import *
from tutor.plugin.maple import *

# meta-informação
meta(author       = 'Fábio Mendes',
     creationdate = datetime(2010, 10, 24),
     status       = 'testing',
     difficulty   = 'hard',
     time         = 10,
     itemtype     = 'test')

# sorteia parâmetros --- 1 negativo e 2 positivos
signs = sample([1,1,-1], 3)
a = oneof(1,2,3,4,5,6,8,9,12) / M(oneof(1,2,3,4,5,6,8,9,12))
b = oneof(1,2,3,4,5,6,8,9,12) / M(oneof(1,2,3,4,5,6,8,9,12))
c = oneof(1,2,3,4,5,6,8,9,12) / M(oneof(1,2,3,4,5,6,8,9,12))
a, b, c = [ cte * s for (s,cte) in zip(signs, [a,b,c]) ]
print('coeficientes: a=%s, b=%s, c=%s' % (a,b,c))

# cria a curva e fatora a equação
ctes = [ (M.numer(cte), M.denom(cte)) for cte in [a,b,c] ]
nums = [ cte[0] for cte in ctes ]
lcm = M.lcm(*[ cte[1] for cte in ctes ])

# cria a curva
curve_F = sum( cte * var**2 for (cte, var) in zip(nums, [x,y,z]) )
curve_eq = curve_F == lcm
print('equação: %s' % curve_eq)

# registra as distâncias corretas e incorretas
dists = [ n for n in (a,b,c) if n > 0 ]
error = M.combine(1/M.sqrt(-[ n for n in (a,b,c) if n < 0 ][0]))
dist_ok = M.combine(1/M.sqrt(max(*dists)))
dist_sub = M.combine(1/M.sqrt(min(*dists)))
print('distâncias: d=%s, d2=%s, err=%s' % (dist_ok, dist_sub, error))

# confunde o vínculo com a distância
dist_evinc = M.combine(M.sqrt(lcm))

# confunde a curva com um elipsoide
dist_elipse = M.combine(1/M.sqrt(max(*[ abs(n) for n in nums ])))

# questão
question(u'Qual é a distância da curva \n\n'
         '      $$f(x,y)=', curve_eq, '$$\n\n'
         'para a origem?')
multiplechoice()

# choice: (a)
s = M.combine
choice_eq(1, dist_ok)
explanation('Escolha correta!') 

# choice: (b)
choice_eq(0.5, dist_sub)
explanation('Esta solução é um mínimo da função distância, mas não é o mínimo global.') 

# choice: (c)
choice_eq(0, error)
explanation('Este ponto é inválido pois daria uma distância negativa.') 

# choice: (d)
choice_eq(0, dist_evinc)
explanation('O vínculo deve ser a equação da curva, enquanto a distância é a função a ser minimizada.') 

# choice: (e)
choice_eq(0, dist_elipse)
explanation('A superfície não é um elipsóide. Por isso não se pode determinar a\n'
            'distância a partir do semi-eixo menor do mesmo.')

end()